home *** CD-ROM | disk | FTP | other *** search
/ Aminet 51 / Aminet 51 (2002)(GTI - Schatztruhe)[!][Oct 2002].iso / Aminet / gfx / fract / FlashMandelWOS.lha / FlashMandel / Developer / Modules / Iff.c < prev    next >
Encoding:
C/C++ Source or Header  |  2002-08-02  |  10.0 KB  |  376 lines

  1. /******************************************************************************
  2. **
  3. **  Coded by Dino Papararo 23-Apr-2001
  4. **
  5. **  Based on NewIff package relased by Commodore
  6. **
  7. **  FUNCTION
  8. **
  9. **    QueryMandPic -- Examine an IFF picture.
  10. **
  11. **  SYNOPSIS
  12. **
  13. **    LONG QueryMandPic (struct ILBMInfo *,struct MandelChunk *,UBYTE *);
  14. **
  15. **  DESCRIPTION
  16. **
  17. **    Passed an initialized ILBMInfo with a not-in-use IFFHandle, a MandelChunk
  18. **
  19. **    structure and a filename, will open an ILBM, fill in ilbm->camg and
  20. **
  21. **    ilbm->bmhd, and close the ILBM.
  22. **
  23. **    This allows you to determine if the ILBM is a size and
  24. **
  25. **    type you want to deal with.
  26. **
  27. **    For succes is necessary the ID_MAND into the iff file !
  28. **
  29. **    Returns 0 for success or an IFFERR (libraries/iffparse.h).
  30. **
  31. **
  32. **  FUNCTION
  33. **
  34. **    LoadMandPic -- Load an IFF picture.
  35. **
  36. **  SYNOPSIS
  37. **
  38. **    LONG LoadMandPic (struct ILBMInfo *,UBYTE *);
  39. **
  40. **  DESCRIPTION
  41. **
  42. **    Function uses a ILBMInfo struct with record ParseInfo.iff initialized
  43. **
  44. **    with AllocIFF() function, and a pointer to a FileName.
  45. **
  46. **    It's necessary a valid Window RPort and ViewPort initialized in the passed
  47. **
  48. **    ILBM Structure for the BODY and COLORS, at end all memory will be freed.
  49. **
  50. **
  51. **  FUNCTION
  52. **
  53. **    SaveMandPic -- save a screen as IFF picture.
  54. **
  55. **  SYNOPSIS
  56. **
  57. **    LONG SaveMandPic (struct ILBMInfo *,struct Chunk *,struct Chunk *,UBYTE *);
  58. **
  59. **  DESCRIPTION
  60. **
  61. **    Function uses a ILBMInfo struct with record ParseInfo.iff initialized
  62. **
  63. **    with AllocIFF() function, two custom chunks, and a pointer to a FileName.
  64. **
  65. **    In the 1st custom chunk I put the copyright infos and in the 2nd the
  66. **
  67. **    special chunk MAND used for window limits, fractal limits, iterations
  68. **
  69. **    type...
  70. **
  71. **    Function will save the icon file too with support for NewIcons.
  72. **
  73. ******************************************************************************/
  74.  
  75. /* Modified for ARexx-support by E. Schwan 23.1.2002 */
  76. /* Modified for StormC-GCC-support by E. Schwan 08.06.2002 */
  77.  
  78. #include <exec/types.h>
  79. #include <intuition/intuitionbase.h>
  80. #include <intuition/screens.h>
  81. #include <graphics/gfxbase.h>
  82.  
  83. #include <iffp/ilbmapp.h>
  84. #include <iffp/ilbm.h>
  85. #include <iffp/packer.h>
  86.  
  87. #ifndef __STORM__
  88. #include <proto/exec.h>
  89. #include <proto/iffparse.h>
  90. #define __NOLIBBASE__
  91. #include <proto/intuition.h>
  92. #include <proto/graphics.h>
  93. #else /*__STORM__*/
  94. #include <clib/exec_protos.h>
  95. #include <clib/intuition_protos.h>
  96. #include <clib/graphics_protos.h>
  97. #include <clib/iffparse_protos.h>
  98. #include <pragmas/exec_pragmas.h>
  99. #include <pragmas/intuition_pragmas.h>
  100. #include <pragmas/graphics_pragmas.h>
  101. #include <pragmas/iffparse_pragmas.h>
  102. #endif /*__STORM__*/
  103.  
  104. #include "FlashMandel.h"
  105.  
  106. #define NOMAND 115L
  107. #define MANDERR 116L
  108.  
  109. #define FROMBLACK 0
  110.  
  111. /* local function prototypes */
  112.  
  113. //IMPORT BOOL Fade (struct Window *,ULONG *,ULONG,ULONG,BOOL);
  114.  
  115. //LONG QueryMandPic (struct ILBMInfo *,struct MandelChunk *,UBYTE *filename);
  116.  
  117. //LONG LoadMandPic (struct ILBMInfo *,UBYTE *,BOOL);
  118.  
  119. //LONG SaveMandPic (struct ILBMInfo *,struct Chunk *,struct Chunk *,UBYTE *);
  120.  
  121. //LONG SavePalette (struct ILBMInfo *,struct Chunk *,UBYTE *);
  122.  
  123. //LONG LoadPalette (struct ILBMInfo *,UBYTE *,BOOL);
  124.  
  125. /*----------------------------------------------------------------------*/
  126.  
  127. /* queryilbm
  128.  *
  129.  * Passed an initilized ILBMInfo with a not-in-use IFFHandle,
  130.  *   and a filename,
  131.  *   will open an ILBM, fill in ilbm->camg and ilbm->bmhd,
  132.  *   and close the ILBM.
  133.  *
  134.  * This allows you to determine if the ILBM is a size and
  135.  *   type you want to deal with.
  136.  *
  137.  * Returns 0 for success or an IFFERR (libraries/iffparse.h)
  138.  */
  139.  
  140. LONG QueryMandPic (struct ILBMInfo *ilbm,struct MandelChunk *ManChk,UBYTE *filename)
  141. {
  142. LONG error;
  143.  
  144. BitMapHeader *bmhd;
  145.  
  146. struct MandelChunk *TmpManChk;
  147.  
  148.   if (! (ilbm->ParseInfo.iff)) return (CLIENT_ERROR);
  149.  
  150.   error = openifile (&(ilbm->ParseInfo),filename,IFFF_READ);
  151.  
  152.   if (! error)
  153.   {
  154.      error = parseifile (&(ilbm->ParseInfo),ID_FORM,ID_ILBM,ilbm->ParseInfo.propchks,ilbm->ParseInfo.collectchks,ilbm->ParseInfo.stopchks);
  155.  
  156.      if ((error == NULL) || (error == IFFERR_EOC) || (error == IFFERR_EOF))
  157.      {
  158.         if (contextis (ilbm->ParseInfo.iff,ID_ILBM,ID_FORM))
  159.         {
  160.            if (TmpManChk = (struct MandelChunk *) findpropdata (ilbm->ParseInfo.iff,ID_ILBM,ID_MAND))
  161.            {           
  162.               CopyMem (TmpManChk,ManChk,sizeof (struct MandelChunk));
  163.               
  164.               if (bmhd = (BitMapHeader *) findpropdata (ilbm->ParseInfo.iff,ID_ILBM,ID_BMHD))
  165.               {
  166.                  CopyMem (bmhd,&ilbm->Bmhd,sizeof (BitMapHeader));
  167.  
  168.                  ilbm->camg = getcamg (ilbm);
  169.               }
  170.                           
  171.               else error = NOFILE;             
  172.             }
  173.  
  174.            else error = NOMAND;
  175.         }
  176.  
  177.         else error = NOFILE;
  178.      }
  179.  
  180.      closeifile (&(ilbm->ParseInfo));
  181.   }
  182.  
  183.   return (error);
  184. }
  185.  
  186. /* LoadMandPic
  187.  *
  188.  * Passed a not-in-use IFFHandle, an initialized ILBMInfo, and filename,
  189.  *   will load an ILBM into your already opened ilbm->scr, setting up
  190.  *   ilbm->Bmhd, ilbm->camg, ilbm->colortable, and ilbm->ncolors
  191.  *   and loading the colors into the screen's viewport
  192.  *
  193.  *   Note that ncolors may be more colors than you can LoadRGB4.
  194.  *   Use MIN(ilbm->ncolors,vp->ColorMap->Count) for color count if
  195.  *   you change the colors yourself using 1.3/2.0 functions.
  196.  *
  197.  * V39 - unless ilbm->IFFPFlags & IFFPF_NOCOLOR32, will do 32-bit
  198.  *   color load under V39 and higher
  199.  *
  200.  * Returns 0 for success or an IFFERR (libraries/iffparse.h)
  201.  *
  202.  * NOTE - LoadMandPic () keeps the IFFHandle open so you can copy
  203.  *   or examine other chunks.  You must call closeifile(iff,ilbm)
  204.  *   to close the file and deallocate the parsed context
  205.  *
  206.  */
  207.  
  208. LONG LoadMandPic (struct ILBMInfo *ilbm,UBYTE *filename,BOOL fade)
  209. {
  210. struct BitMap *TmpBM;
  211.  
  212. LONG error;
  213.  
  214.   if (! (ilbm->ParseInfo.iff)) return (CLIENT_ERROR);
  215.  
  216.   if (! ilbm->scr) return (CLIENT_ERROR);
  217.  
  218.   if (! (ilbm->vp)) ilbm->vp = &ilbm->scr->ViewPort;
  219.  
  220.   error = openifile (&ilbm->ParseInfo,filename,IFFF_READ);
  221.  
  222.   if (! error)
  223.   {
  224.      error = parseifile (&ilbm->ParseInfo,ID_FORM,ID_ILBM,ilbm->ParseInfo.propchks,ilbm->ParseInfo.collectchks,ilbm->ParseInfo.stopchks);
  225.  
  226.      if ((! error) || (error == IFFERR_EOC) || (error == IFFERR_EOF))
  227.      {
  228.         if (contextis (ilbm->ParseInfo.iff,ID_ILBM,ID_FORM))
  229.         {
  230.            if (TmpBM = AllocBitMap ((ULONG) ilbm->win->Width,(ULONG) ilbm->win->Height,(ULONG) ilbm->wrp->BitMap->Depth,BMF_INTERLEAVED | BMF_CLEAR | BMF_MINPLANES,NULL))
  231.            {
  232.               if (! (error = loadbody (ilbm->ParseInfo.iff,TmpBM,&ilbm->Bmhd)))
  233.  
  234.                  BltBitMapRastPort (TmpBM,(LONG) ilbm->win->LeftEdge,(LONG) ilbm->win->TopEdge,ilbm->wrp,(LONG) ilbm->win->LeftEdge,(LONG) ilbm->win->TopEdge,(LONG) ilbm->win->Width,(LONG) ilbm->win->Height,0xC0);
  235.  
  236.               FreeBitMap (TmpBM);
  237.            }
  238.  
  239.            if (! (getcolors (ilbm)))
  240.            {
  241.  
  242.               if (fade != FALSE) Fade (ilbm->win,(ULONG *) (ilbm->colorrecord),25L,1L,FROMBLACK);
  243.  
  244.               else setcolors (ilbm,ilbm->vp);
  245.  
  246.               freecolors (ilbm);
  247.            }
  248.         }
  249.  
  250.         else error = NOFILE;
  251.      }
  252.  
  253.      closeifile (&(ilbm->ParseInfo));
  254.   }
  255.  
  256.   return (error);
  257. }
  258.  
  259. LONG SaveMandPic (struct ILBMInfo *ilbm,struct Chunk *chunklist1,struct Chunk *chunklist2,UBYTE *filename)
  260. {
  261. struct BitMap *TmpBM;
  262.  
  263. Color32 *colortable32;
  264.  
  265. UWORD count;
  266.  
  267. ULONG modeid;
  268.  
  269. LONG error = IFFERR_NOMEM;
  270.  
  271.   modeid = GetVPModeID (ilbm->vp);
  272.  
  273.   count = ilbm->vp->ColorMap->Count;
  274.  
  275.   if (colortable32 = (Color32 *) AllocVec ((ULONG) (sizeof (Color32) * count),MEMF_CLEAR))
  276.   {    
  277.      if (TmpBM = AllocBitMap ((ULONG) ilbm->win->Width,(ULONG) ilbm->win->Height,(ULONG) ilbm->wrp->BitMap->Depth,BMF_INTERLEAVED | BMF_CLEAR | BMF_MINPLANES,NULL))
  278.      {
  279.         GetRGB32 (ilbm->vp->ColorMap,0L,(ULONG) count,(ULONG *) colortable32);
  280.  
  281.         BltBitMap (ilbm->wrp->BitMap,(LONG) ilbm->win->LeftEdge,(LONG) ilbm->win->TopEdge,TmpBM,(LONG) ilbm->win->LeftEdge,(LONG) ilbm->win->TopEdge,(LONG) ilbm->win->Width,(LONG) ilbm->win->Height,0xC0,0xFF,NULL);
  282.  
  283.         error = saveilbm (ilbm,TmpBM,modeid,ilbm->win->Width,ilbm->win->Height,ilbm->win->Width,ilbm->win->Height,colortable32,count,32,mskNone,0,chunklist1,chunklist2,filename);
  284.  
  285.         FreeBitMap (TmpBM);
  286.      }
  287.  
  288.      FreeVec (colortable32);
  289.   }
  290.  
  291.   return (error);
  292. }
  293.  
  294. LONG LoadPalette (struct ILBMInfo *ilbm,UBYTE *filename, BOOL fade)
  295. {
  296. LONG error;
  297.  
  298.   error = openifile (&(ilbm->ParseInfo),filename,IFFF_READ);
  299.  
  300.   if (! error)
  301.   {
  302.      error = parseifile (&(ilbm->ParseInfo),ID_FORM,ID_ILBM,ilbm->ParseInfo.propchks,ilbm->ParseInfo.collectchks,ilbm->ParseInfo.stopchks);
  303.  
  304.      if ((! error) || (error == IFFERR_EOC) || (error == IFFERR_EOF))
  305.      {
  306.         if (! (error = getcolors (ilbm)))
  307.         {
  308.  
  309.           if (fade != FALSE) Fade (ilbm->win,(ULONG *) (ilbm->colorrecord),25L,1L,FROMBLACK);
  310.  
  311.           else setcolors (ilbm,ilbm->vp);
  312.  
  313.            freecolors (ilbm);
  314.         }
  315.      }
  316.  
  317.      closeifile (&(ilbm->ParseInfo));
  318.   }
  319.  
  320.   return (error);
  321. }
  322.  
  323. LONG SavePalette (struct ILBMInfo *ilbm,struct Chunk *chunklist,UBYTE *filename)
  324. {
  325. struct IFFHandle *iff;
  326.  
  327. struct Chunk *chunk;
  328.  
  329. Color32 *colortable32;
  330.  
  331. UWORD ncolors;
  332.  
  333. LONG size,error;
  334.  
  335. ULONG chunkID;
  336.  
  337.   iff = ilbm->ParseInfo.iff;
  338.  
  339.   ncolors = ilbm->vp->ColorMap->Count;
  340.  
  341.   error = openifile (&(ilbm->ParseInfo),filename,IFFF_WRITE);
  342.  
  343.   if (! error)
  344.   {
  345.     error = PushChunk (iff,ID_ILBM,ID_FORM,IFFSIZE_UNKNOWN);
  346.  
  347.     if (colortable32 = (Color32 *) AllocVec ((ULONG) (sizeof (Color32) * ncolors),MEMF_CLEAR))
  348.     {
  349.        GetRGB32 (ilbm->vp->ColorMap,0L,(ULONG) ncolors,(ULONG *) colortable32);
  350.  
  351.        CkErr (putcmap (iff,colortable32,ncolors,32));
  352.  
  353.        FreeVec (colortable32);
  354.     }
  355.  
  356.     for (chunk = chunklist; chunk; chunk = chunk->ch_Next)
  357.     {
  358.       chunkID = chunk->ch_ID;
  359.  
  360.       if ((chunkID != ID_BMHD) && (chunkID != ID_CMAP) && (chunkID != ID_CAMG))
  361.       {
  362.         size = ((chunk->ch_Size == IFFSIZE_UNKNOWN) ? strlen (chunk->ch_Data) : chunk->ch_Size);
  363.  
  364.         CkErr (PutCk (iff,chunkID,size,chunk->ch_Data));
  365.       }
  366.     }
  367.  
  368.     CkErr (PopChunk (iff)); /* close out the FORM */
  369.  
  370.     closeifile (&(ilbm->ParseInfo));    /* and the file */
  371.   }
  372.  
  373.   return (error);
  374. }
  375.  
  376.